Главная arrow книги arrow Копия Глава 12. arrow Обсуждение вопроса
Обсуждение вопроса

Еще одной важной характерной особенностью планов HTN является возможность совместного использования подзадач. Напомним, что совместным использованием подзадач называется применение одного и того же действия для реализации двух разных этапов в декомпозиции планов. Если совместное использование подзадач запрещено, то каждая конкретизация декомпозиции d' должна быть выполнена только одним способом, а не многими, что приводит к отсечению значительной части пространства поиска. Обычно такое отсечение обеспечивает некоторую экономию времени и в худшем случае приводит к решению, лишь немного более длинному, чем оптимальное. Но в некоторых случаях возникают более существенные проблемы. Например, рассмотрим цель: "Насладись медовым месяцем и создай большую семью". Библиотека планов может содержать решение "вступи в брак и отправляйся на Гавайи" для первой подцели и "вступи в брак и заведи двух детей" для второй. Без совместного использования подзадач план будет включать два разных действия по вступлению в брак для одного человека, но такой вариант многие считают весьма нежелательным.

Интересным примером анализа затрат и результатов совместного использования подзадач является применение этого метода при оптимизации компиляторов. Рассмотрим задачу компиляции выражения tan (x) -sin (x). В большинстве компиляторов такая задача выполняется путем слияния результатов двух отдельных вызовов процедур тривиальным способом: все этапы процедуры вычисления тангенса tan выполняются перед каким-либо из этапов вычисления синуса sin. Но рассмотрим следующие аппроксимации для sin и tan с помощью рядов Тэйлора:

Планировщик HTN с совместным использованием подзадач может выработать более эффективное решение, поскольку он способен выбрать вариант реализации многочисленных этапов вычисления sin в сочетании с существующими этапами вычисления tan. В большинстве компиляторов межпроцедурное совместное использование этапов такого рода не осуществляется, поскольку для них потребовалось бы слишком много времени на рассмотрение всех возможных совместно используемых планов. Вместо этого в большинстве компиляторов каждый субплан вырабатывается независимо и только после этого, возможно, происходит модификация результата с помощью локального оптимизатора.